![ワークショップ『サーバーレスエンジニアのための体験型Linux入門 ~regreSSHion(CVE-2024-6387)編~』を開催しました #devio2024 #cm_odyssey](https://devio2024-media.developers.io/image/upload/v1721428180/user-gen-eyecatch/oyj2ypnyqpe0hbkco8ft.png)
ワークショップ『サーバーレスエンジニアのための体験型Linux入門 ~regreSSHion(CVE-2024-6387)編~』を開催しました #devio2024 #cm_odyssey
クラスメソッド設立20周年を記念し、オフラインイベント、オンラインイベントで展開するイベント「Classmethod Odyssey」は2024年07月末まで、絶賛開催中です。
2024/7/20(土)の10:00-10:45に、サーバーレスエンジニアのためのLinuxハンズオンを開催しました。
参加いただいた皆さま、お手伝いいただいた のんピさん、枡川さんありがとうございました。
タイトル
サーバーレスエンジニアのための体験型Linux入門 - regreSSHion(CVE-2024-6387)編
ワークショップコンテンツ
ワークショップはGitHub Pagesで公開しています。
ワークショップではAmazon Cloud9を利用しましたが、Ubuntu 22.04 があれば、パッケージを何個かインストールだけでワークショップコンテンツを使い回せるはずです。
概要
サーバーレス技術の普及に伴い、エンジニアがOSを意識する機会は大幅に減りました。とはいえ、そのようなエンジニアが技術領域を広げるために、サーバーレスの対極にあるサーバーフルな世界に足を踏み入れる機会があってもよいでしょう。
2024年7月にsshdに関する脆弱性regreSSHion(CVE-2024-6387)が公開されました。
脆弱性を発見した Qualys のエンジニアブログでは、regreSSHion について以下のような解説があります。
The vulnerability, which is a signal handler race condition in OpenSSH’s server (sshd), allows unauthenticated remote code execution (RCE) as root on glibc-based Linux systems; that presents a significant security risk. This race condition affects sshd in its default configuration.
脆弱性の解説記事に現れるこれらキーワードをサーバーレスエンジニア向けに体験してもらうのが、本ワークショップの狙いです。
この脆弱性を修正したエンジニアは、脆弱性を回避するミニマルなパッチも提供しています
1) Critical race condition in sshd
diff --git a/log.c b/log.c
index 9fc1a2e2e..191ff4a5a 100644
--- a/log.c
+++ b/log.c
@@ -451,12 +451,14 @@ void
sshsigdie(const char *file, const char *func, int line, int showfunc,
LogLevel level, const char *suffix, const char *fmt, ...)
{
+#ifdef SYSLOG_R_SAFE_IN_SIGHAND
va_list args;
va_start(args, fmt);
sshlogv(file, func, line, showfunc, SYSLOG_LEVEL_FATAL,
suffix, fmt, args);
va_end(args);
+#endif
_exit(1);
}
マクロSYSLOG_R_SAFE_IN_SIGHAND
からピンとくる人も多いかと思いますが、シグナルハンドラー内では reentrant な syslog 関数(syslog_r
)が利用されてている場合のみ、ログ出力するように修正しています。
OpenSSHの開発母体とも言える、OpenBSDというセキュリティを強く意識したBSD系OSでは、まさにこの syslog_r 関数が定義されています。
glibc
(を使っているLinux OS)ではそのような関数は定義されておらず、シグナルハンドラー内で再入可能でない syslog()
関数とそれに付随する malloc()
/free()
呼び出しに、別のシグナルハンドラーも上手いタイミングで割り込ませて、ヒープを不正な状態にし、任意コード実行につなげています。
この問題のハンドラーは、SSH 認証時のタイムアウト目的のために設定されている SIGALRM
シグナルに設定されており、認証は成功していないので、unauthenticated です。
ワークショップを終えると、この意味が理解できるようになるはずです。
ワークショップの誕生背景
今年の2月に「eBPF & コンテナ情報交換会 @ 福岡」という勉強会が開催されました。
当日はキラキラしたサーバーレスな勉強会も近所で開催されていて、それと引っ掛けて、主催者の @udzura さんが「こっちのイベントはサーバーフルだね」と発言していたのが強く印象に残っていました。
その後、この勉強会の登壇者でもある、森田さんが執筆した『基礎から学ぶコンテナセキュリティ』を有志で読書会する機会がありました。
読書会では、一昔前のミドルウェアをいじっていた人なら当然のごとく知っている fork()
などプロセス周りの知識を優秀な若手が詳しくないというギャップが面白く、ならば、サーバーレスシステムの裏で動いているはずのLinuxの基礎に触れる機会があってもよいのではないかということで、このワークショップを開催することにしました。
2024年7月に入って、世間を震撼させた sshd の脆弱性(regreSSHion;CVE-2024-6387) が公表されました。
脆弱性を再現させるための細かいテクニックはともかく、脆弱性につながる基本的な考え方は非常にシンプルなものだったので、新鮮なこの脆弱性を切り口に、Linux の基礎に触れるワークショップを作成しました。